for有對於的意思,each有每個的意思,合起來就是對於每個的意思。
語法:
array.forEach(callback(currentValue, index, array), thisArg)
例子:
const arr = [1, 2, 3]; arr.forEach((value, index) =>
{ console.log(`索引 ${index} 的值是 ${value}`); });
//索引 0 的值是 1
//索引 1 的值是 2
//索引 2 的值是 3
裡面可放兩個參數callback(回呼函式)、thisArg(this引數),而thisArg的「Arg」是英文 Argument 的縮寫。
第一個參數是一個回呼函式callback(currentValue, index, array)。
裡面可以放三個參數,currentValue(目前值)、index(索引)、array(陣列,forEach()方法被呼叫時所作用的陣列)。最少必須放一個currentValue參數。
第二個參數thisArg。
是this Argument 的縮寫,可以把它想像成是把某個函式、物件、值,綁定成forEach()裡第一個參數回呼函式裡的this值。告訴 JavaScript 引擎,在執行回呼函式 (callback) 時,應該將 this 關鍵字的值設定為誰。
用途: 對陣列中的每個元素執行一個提供的函式。
回傳值: undefined(它不接受回呼函式的回傳值,也不會回傳一個新陣列,也不會改變原始陣列)。
使用時機:對每個值執行某些事情,且沒有要使用回傳值。
注意事項:forEach 不能改變陣列的長度。但可以改變陣列中物件內部的屬性。
這方法的名字意思可以從兩個觀點來看。
1.縮減:將多個元素透過某種運算,最終變成一個結果。
2.累加(有誤導性):當每個人剛學習接觸到這個用法的時候,大部分都是加法來累加,計算總合。但其實你可以用乘法、減法、計算平均值、陣列轉物件、陣列轉物件...等等。
語法:array.reduce(callback(accumulator, currentValue, index, array), initialValue)
第一個參數回呼函式callback(accumulator, currentValue, index, array)。
回呼函式callback裡可放四個參數。
accumulator (累加器): 最重要的參數,儲存了前一次回呼函式執行的結果。
currentValue (目前值):正在被處理的陣列元素。
index (索引):目前正在處理的元素的索引值(從 0 開始)。
array (陣列):reduce 方法被呼叫時所作用的完整原始陣列。
第二個參數initialValue (初始值): 可選的第二個參數,設定累加器在第一次執行時的起始值。
例子:
const numbers = [10, 5, 2];
// 範例使用了 initialValue = 0 (起始值為 0)
const sum = numbers.reduce((accumulator, currentValue) => {
// 這裡的運算邏輯是:累加器 + 當前值
return accumulator + currentValue;
}, 0); // <-- 這裡的 0 是 initialValue (初始值)
console.log(sum); // 輸出: 17
運作步驟:
第一次執行,accumulator為0 (初始值),currentValue為10,回傳值(新的 accumulator)0+10=10。
第二次執行,accumulator為10 (初始值),currentValue為5,回傳值(新的 accumulator)10+5=15。
第三次執行,accumulator為15 (初始值),currentValue為2,回傳值(新的 accumulator)15+2=17。
reduce會自動傳遞並更新了這個 accumulator (累加器) 的值。
用途:將陣列的所有元素縮減成一個單一值。
回傳值:執行後的單一值。
使用時機:對每個值執行某種算法,只想要有單一值,並不想要陣列。
為何不使用一般function,要用reduce?:
這兩種function看起來一樣是函式,除了裡面放的參數效果不同以外,return的規則也略有不同。
一般function只要區塊裡面有使用return後,就會把整個function當作執行結束,並把這個return回傳值當成是這個function執行結果的值。但reduce這個function,在回呼函式內區塊裡寫return,如果當下不是執行到最後的陣列的值(reduce的特性是,每一個值,照此陣列索引順序各別執行一次你在reduce()裡的回呼函式區塊{}中的步驟),它並不會把這個return當成reduce執行結果的值,而是把這個值當成下一輪的起始值回傳給reduce,再繼續把陣列中的下一個值跟起始值,去做你寫的回呼函式區塊當中的步驟,直到把陣列中的最後一個值執行完畢後,才會把這個結果當成是reduce執行結果的值。
將陣列中的每個值執行一個函式,並把結果產出一個新的陣列。執行map()後產生的新陣列,與未執行map()前的陣列有一定的關係,可能是加法關係、減法關係、乘法關係...等等。
語法:
const newArray = arr.map((currentValue, index, array) => {
return transformedValue;
});
例子:
const Prices = [100, 50, 200];
// 使用 map 創建一個新的陣列,其中每個元素都是原始元素的兩倍
const doublePrices = Prices.map((price) => {
// 回傳的結果就是新陣列中對應位置的值
return price * 2;
});
console.log(doublePrices); // 輸出: [200, 100, 400]
console.log(Prices); // 輸出: [100, 50, 200] (原始陣列沒有改變)
用途: 對陣列的每個元素使用回呼函式後的值,產出新的陣列。
回傳值:新的陣列。
使用時機:對每個值執行某種算法,並想要回傳值為新的陣列。
是否改變原本陣列:不改變原始陣列。
有些人也會叫做過濾,我覺得兩者都很適合,怎麼叫都可以。
會根據你的條件函式,來回傳結果為true的值。若無值,則回傳[]空陣列。
語法:
const newArray = arr.filter(callback(currentValue, index, array))
例子:
const numbers = [10, 5, 20]; const bigNumbers = numbers.filter(num => num > 10);
// bigNumbers 為 [20]
用途: 對陣列的每個值執行回呼函式,回呼函式可以包含任何程式碼邏輯,但它最後的 return 語句必須產生一個布林值。
回傳值:經過執行回呼函式後,得到符合條件的新陣列結果。
使用時機:從現有陣列中,創建一個只包含符合特定條件元素的新陣列。
注意事項:
map()、filter()、reduce():它們都是不可變 (Immutable) 的方法,它們不會改變原始陣列。
forEach():本身不會改變陣列結構,但可以在內部改變陣列裡面的物件內容)。